package com.pe.pgn.clubpgn.service.impl;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.pe.pgn.clubpgn.dao.ReporteLiquidacionDao;
import com.pe.pgn.clubpgn.domain.ClpbClientePersona;
import com.pe.pgn.clubpgn.domain.ClpbPrograma;
import com.pe.pgn.clubpgn.domain.ClpdMeta;
import com.pe.pgn.clubpgn.domain.ClpmHistorialLiquidacion;
import com.pe.pgn.clubpgn.domain.ClpmLiquidacion;
import com.pe.pgn.clubpgn.domain.ClprPeriodoLiquidacion;
import com.pe.pgn.clubpgn.domain.ClprPeriodoPrograma;
import com.pe.pgn.clubpgn.domain.beans.BNPeriodo;
import com.pe.pgn.clubpgn.domain.beans.BNReporteLiquidacion;
import com.pe.pgn.clubpgn.domain.beans.BNResumenLiquidacion;
import com.pe.pgn.clubpgn.service.ReporteLiquidacionService;

/**
 * @author Edwin Farfan
 */
@Service("reporteLiquidacionService")
public class ReporteLiquidacionServiceImpl implements ReporteLiquidacionService {

	@Autowired
	private ReporteLiquidacionDao dao;
	
	public List<Map<String, Object>> listaReporteLiquidacion() {
		return dao.listaReporteLiquidacion();
	}
	
	public List<BNReporteLiquidacion> listReporteLiquidacionConFiltros(String idPeriodo, String idPrograma){
		
		ClprPeriodoPrograma periodo = dao.findClprPeriodoPrograma(new Long (idPeriodo));
		List<BNReporteLiquidacion> listaLiquidacion = dao.listReporteLiquidacionConFiltros(periodo, idPrograma);
		List<ClpdMeta> listaMetas = dao.listaMetas(idPrograma);
		
		if(!listaLiquidacion.isEmpty() 
				&& !listaMetas.isEmpty()){

			Double vaMetaInicial = listaMetas.get(0).getVaMeta();
			for (BNReporteLiquidacion liquidacion : listaLiquidacion) {
				
				Double cantidad = liquidacion.getCantidadM3();
				
				if(cantidad  < vaMetaInicial){
					liquidacion.setMeta(null);
					continue;
				}
				
				if(listaMetas.size() == 1){

					liquidacion.setMeta(vaMetaInicial);
				}
				else{
					
					Double vaMetaAnterior = listaMetas.get(0).getVaMeta();
					Double vaCosto = listaMetas.get(0).getVaCosto();
					
					for (int i = 0; i < listaMetas.size(); i++) {
						
						ClpdMeta meta = listaMetas.get(i);
						if (cantidad >= meta.getVaMeta()) {
							
							vaMetaAnterior = meta.getVaMeta();  
							vaCosto = meta.getVaCosto();
						}
					}		
					
					liquidacion.setMeta(vaMetaAnterior);
					liquidacion.setCosto(vaCosto);
				}
			}
		}
		
		return listaLiquidacion;
	}
	public List<ClpdMeta> listaMetas(String idPrograma){
		return dao.listaMetas(idPrograma);	
	}
	
	public void generarLiquidacion(List<BNReporteLiquidacion> liquidaciones, String idPrograma,String idPeriodo){
		
		dao.generarLiquidacion(liquidaciones, idPrograma,idPeriodo);
	}

	public Map<String, Object> generarLiquidacionSP(Long idPrograma, Long idPeriodo) {
		return dao.generarLiquidacionSP(idPrograma, idPeriodo);
	}

	public List<BNPeriodo> periodosPorPrograma(Long idPrograma, Long idPeriodo, boolean itemDefault){
		
		return dao.periodosPorPrograma(idPrograma, idPeriodo, itemDefault);
	}
	
	public BNResumenLiquidacion generarResumenLiquidacion(BigDecimal coPeriodoLiquidacion){
		return dao.generarResumenLiquidacion(coPeriodoLiquidacion);
	}

	public ClprPeriodoPrograma findClprPeriodoPrograma(Long id){
		return dao.findClprPeriodoPrograma(id);
	}
	
	public ClpbClientePersona findClpbClientePersona(Long id){
		return dao.findClpbClientePersona(id);
	}
	
	public List<ClprPeriodoLiquidacion> findPeriodoLiquidacionsByProgramaAndPeriodoPrograma
				(ClpbPrograma programa, ClprPeriodoPrograma periodoPrograma){
		return dao.findPeriodoLiquidacionsByProgramaAndPeriodoPrograma(programa, periodoPrograma);
	}
	
	public List<ClpmLiquidacion> findLiquidacionByPeriodoLiquidacionAndCliente
						(ClpbClientePersona cliente,ClprPeriodoLiquidacion periodoLiquidacion){
		
		return dao.findLiquidacionByPeriodoLiquidacionAndCliente(cliente, periodoLiquidacion);
	}
	
	public List<ClpmHistorialLiquidacion> findHistorialLiquidacionByPeriodoLiquidacionAndCliente
					(ClpbClientePersona cliente,ClprPeriodoLiquidacion periodoLiquidacion){
		
		return dao.findHistorialLiquidacionByPeriodoLiquidacionAndCliente(cliente, periodoLiquidacion);
	}
	
	public ClpbPrograma findClpbPrograma(Long id){
		return dao.findClpbPrograma(id);
	}
	
	public List<BNReporteLiquidacion> consultarLiquidaciones(ClpbPrograma idPrograma, ClprPeriodoPrograma idPeriodo){
		return dao.consultarLiquidaciones(idPrograma, idPeriodo);
	}
	
	
	public List<ClpbPrograma> listadoProgramasHistoricos(){
		return dao.listadoProgramasHistoricos();
	}
	
	public List<BNPeriodo> periodosPorProgramaHistorio(Long idPrograma){
		return dao.periodosPorProgramaHistorio(idPrograma);
	}
	
	public List<Map<String, Object>> obtenerRegistrosLiquidacionPorPeriodo(BigDecimal coPrograma, BigDecimal coPeriodoPrograma){
		return dao.	obtenerRegistrosLiquidacionPorPeriodo(coPrograma, coPeriodoPrograma);
	}

	@Override
	public List<BNPeriodo> periodosPorHistorioLiquidacion(Long idPrograma) {
		return dao.periodosPorHistorioLiquidacion(idPrograma);
	}

	@Override
	public int verificarExistePeriodoLiq(Long idPrograma, Long idPeriodo) {
		return dao.verificarExistePeriodoLiq(idPrograma,idPeriodo);
	}
}
